home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / data / happysrc / pascomp.h < prev    next >
Text File  |  1993-11-30  |  25KB  |  471 lines

  1. /*************************************************
  2.  **                                             **
  3.  **     HAPPy Pascal Compiler                   **
  4.  **        共通ヘッダ                           **
  5.  **                                             **
  6.  **         Copyright (c) H.Asano 1992,1993     **
  7.  **                                             **
  8.  *************************************************/
  9.  
  10. /***************************************/
  11. /* HAPPyの制限事項となっている定数     */
  12. /***************************************/
  13. #define  Displimit        20            /* displayの配列数            */
  14. #define  Maxlevel         10            /* 関数・手続きの最大ネスト数  */
  15. #define  Maxstrlng       256            /* 最大文字列長               */
  16. #define  Maxdiglng        15            /* 最大実数型文字長           */
  17. #define  MaxIDlng         32            /* 名前の最大識別可能文字数   */
  18. #define  setlow            0            /* 集合の要素の最低値         */
  19. #define  sethigh          31            /* 集合の要素の最大値         */
  20. #define  Maxaddr       32767            /* 最大アドレス(型の大きさ)   */
  21. #define  Cixmax         1000            /* case文選択肢定数の範囲     */
  22. #define  Maxfileno         8            /* 外部ファイル数             */
  23.  
  24. /***************************************/
  25. /*          その他の定数               */
  26. /***************************************/
  27. #define  Maxint    2147483647 /* 整数の最大値                   */
  28. #define  ordminchar  0        /* 最小文字コード                 */
  29. #define  ordmaxchar  255      /* 最大文字コード                 */
  30.  
  31. #define  intsize    1         /* integer型のサイズ              */
  32. #define  realsize   1         /* real型のサイズ                 */
  33. #define  charsize   1         /* char型のサイズ                 */
  34. #define  boolsize   1         /* boolean型のサイズ              */
  35. #define  ptrsize    1         /* pointer型のサイズ              */
  36. #define  setsize    1         /* 集合型のサイズ                 */
  37. #define  stackelsize 1        /* スタックの1要素サイズ          */
  38. #define  parmsize stackelsize /* 手続き・関数の引数のサイズ      */
  39. #define  maxstack   1         /* stackの1要素の最大サイズ       */
  40. #define  charmax    1         /*    */
  41. #define  nil        0         /* pascal の nil と 同じ          */
  42.  
  43. #define  lcaftermarkstack 5   /* mst命令実行後のlcの値          */
  44. #define  inputadr  lcaftermarkstack    /* input  buffer address */
  45. #define  outputadr inputadr + charmax  /* output buffer address */
  46.  
  47. #define  intal         1      /* integer型の境界     */
  48. #define  realal        1      /* real   型の境界     */
  49. #define  charal        1      /* char   型の境界     */
  50. #define  boolal        1      /* boolean型の境界     */
  51. #define  adral         1      /* pointer型の境界     */
  52. #define  fileal     charal    /* file   型の境界     */
  53. #define  setal         1      /* set    型の境界     */
  54. #define  stackal       1      /*  */
  55. #define  parmal    stackal    /* パラメータの境界    */
  56. #define  recal         1      /* record    の境界    */
  57.  
  58.  
  59. /***********************************/
  60. /*      boolean型の定義            */
  61. /***********************************/
  62. typedef enum bool  {false = 0,          /* 偽 */
  63.             true  = 1           /* 真 */
  64.            }
  65.              boolean ;
  66.  
  67. /***********************************/
  68. /* set operation マクロ の定義     */
  69. /***********************************/
  70.  
  71. /* addset(S,pos) ・・・ Sに要素posを加える                 */
  72. /* inset (S,pos) ・・・ Sに要素posが含まれているか判定する */
  73.  
  74. #define addset(S,pos)     \
  75.     (*(((pos)>31) ? &(S.H) : &(S.L)) |= ((long)1 << ((pos)&0x1F)))
  76.  
  77. #define inset(S,pos)      \
  78.         (( (((pos)>31) ? (S.H) : (S.L)) >> ((pos)&0x1f) )&0x1)
  79.  
  80. typedef struct {
  81.        unsigned long H;   /* 32-63までの要素に対するエリア */
  82.        unsigned long L;   /*  0-31までの要素に対するエリア */
  83.      } Set ;
  84.  
  85.  
  86. /***********************************/
  87. /*         型のtypedef             */
  88. /***********************************/
  89. typedef struct Constant    csp ;  /* 定数  の構造体 */
  90. typedef struct Structure   stp ;  /* 構造  の構造体 */
  91. typedef struct Identifier  ctp ;  /* 名前  の構造体 */
  92. typedef struct labl        lbp ;  /* ラベルの構造体 */
  93.  
  94. /***************************************/
  95. /* pascal source の symbolの種類定義   */
  96. /***************************************/
  97. enum symbol   { ident,                  /* 名前                       */
  98.                 intconst,               /* 整数定数                   */
  99.                 realconst,              /* 実数定数                   */
  100.                 stringconst,            /* 2文字以上の文字列          */
  101.                 notsy,                  /* not                        */
  102.                 mulop,                  /* * / div mod and            */
  103.                 addop,                  /* + - or                     */
  104.                 relop,                  /* = <> < <= > >= in          */
  105.                 lparent,                /* (                          */
  106.         rparent,                /* )                          */
  107.         lbrack,                 /* [                          */
  108.                 rbrack,                 /* ]                          */
  109.                 comma,                  /* ,                          */
  110.                 semicolon,              /* ;                          */
  111.                 period,                 /* .                          */
  112.                 period2,                /* ..                         */
  113.                 arrow,                  /* ^                          */
  114.                 colon,                  /* :                          */
  115.                 becomes,                /* :=                         */
  116.                 labelsy,                /* label                      */
  117.                 constsy,                /* const                      */
  118.                 typesy,                 /* type                       */
  119.                 varsy,                  /* var                        */
  120.                 funcsy,                 /* func                       */
  121.                 progsy,                 /* program                    */
  122.                 procsy,                 /* procedure                  */
  123.                 setsy,                  /* set                        */
  124.                 packedsy,               /* packed                     */
  125.                 arraysy,                /* array                      */
  126.                 recordsy,               /* record                     */
  127.                 filesy,                 /* file                       */
  128.                 beginsy,                /* begin                      */
  129.                 ifsy,                   /* if                         */
  130.                 casesy,                 /* case                       */
  131.                 repeatsy,               /* repeat                     */
  132.                 whilesy,                /* while                      */
  133.                 forsy,                  /* for                        */
  134.                 withsy,                 /* with                       */
  135.                 gotosy,                 /* goto                       */
  136.                 endsy,                  /* end                        */
  137.                 elsesy,                 /* else                       */
  138.                 untilsy,                /* until                      */
  139.                 ofsy,                   /* of                         */
  140.                 dosy,                   /* do                         */
  141.                 tosy,                   /* to                         */
  142.                 downtosy,               /* downto                     */
  143.                 thensy,                 /* then                       */
  144.                 nilsy,                  /* nil                        */
  145.                 othersy                 /* その他の記号               */
  146.              }  ;
  147.  
  148. /***************************************/
  149. /* pascal の演算子の種類               */
  150. /***************************************/
  151. enum operator   {mul,                   /*    *                       */
  152.                  rdiv,                  /*    /                       */
  153.                  andop,                 /*    and                     */
  154.                  idiv,                  /*    div                     */
  155.                  imod,                  /*    mod                     */
  156.                  plus,                  /*    +                       */
  157.                  minus,                 /*    -                       */
  158.                  orop,                  /*    or                      */
  159.                  ltop,                  /*    <                       */
  160.                  leop,                  /*    <=                      */
  161.                  geop,                  /*    >=                      */
  162.                  gtop,                  /*    >                       */
  163.                  neop,                  /*    <>                      */
  164.                  eqop,                  /*    =                       */
  165.                  inop,                  /*    in                      */
  166.                  noop                   /*    演算子でないもの        */
  167.               } ;
  168.  
  169. /**********************************************************************/
  170. /****       プログラムパラメータ(ファイル名) に関する型定義        ****/
  171. /**********************************************************************/
  172.  
  173. typedef struct filerec  extfilep ;
  174.  
  175. struct filerec {
  176.    char      filename[MaxIDlng+1] ;     /* ファイル名                 */
  177.    extfilep  *nextfile            ;     /* 次へのポインタ             */
  178. } ;
  179.  
  180. /*********************************************************************/
  181. /****               label に関する型定義                          ****/
  182. /*********************************************************************/
  183.  
  184. struct labl {
  185.    lbp         *nextlab           ;     /* 次のlablアドレス           */
  186.    boolean     defined            ;     /* 定義フラグ                */
  187.    int         labval             ;     /* pascalソース上のラベル値   */
  188.    int         labname            ;     /* P-codeソース上のラベル値   */
  189. }  ;
  190.  
  191. /*********************************************************************/
  192. /****             constant(定数)に関する型定義                    ****/
  193. /*********************************************************************/
  194.  
  195. enum cstclass { real,                   /* 実数型                     */
  196.                 pset,                   /* 集合型                     */
  197.                 strg } ;                /* 文字列型                   */
  198.  
  199. struct Constant {
  200.    enum cstclass   cclass    ;          /* 定数の種別                 */
  201.    union {
  202.       char         *rval         ;      /* 実数の定数を格納           */
  203.       Set          pval          ;      /* 集合値を格納               */
  204.       char         *sval         ;      /* 文字列定数を格納           */
  205.    }  c  ;
  206. }  ;
  207.  
  208. union valu {
  209.    long    ival   ;                     /* 整数、文字(1文字)           */
  210.    csp     *valp  ;                     /* 上記以外はcspへのポインタ  */
  211. } ;
  212.  
  213. /*********************************************************************/
  214. /****         identifiler(名前) に関する型定義                    ****/
  215. /*********************************************************************/
  216.  
  217. enum idclass {  types,                  /*  型                        */
  218.                 konst,                  /*  定数                      */
  219.                 vars,                   /*  変数                      */
  220.                 field,                  /*  レコードの欄              */
  221.                 proc,                   /*  手続き                    */
  222.                 func  };                /*  関数                      */
  223.  
  224. enum idkind   { actual,                 /*  実                        */
  225.                 formal }  ;             /*  仮                        */
  226.  
  227. enum declkind { standard,               /*  標準宣言                  */
  228.                 declared };             /*  ユーザ定義のもの          */
  229.  
  230. enum where       /****** displayで使い、この水準がどこの定義かを示す****/
  231.               { blck  ,                 /* block で定義されている     */
  232.                 crec  ,                 /* constant record            */
  233.                 vrec  ,                 /* variable record            */
  234.                 rec    }  ;             /* record                     */
  235.  
  236. struct Identifier {
  237.   char         name[MaxIDlng+1] ;  /* 名前                            */
  238.   char         linkno           ;  /* 引数の名前並び番号(引数のみ有効)*/
  239.   ctp          *llink           ;  /* 左へのポインタ                  */
  240.   ctp          *rlink           ;  /* 右へのポインタ                  */
  241.   stp          *idtype          ;  /* 名前の型                        */
  242.   ctp          *next            ;  /* 順序がある場合次へのポインタ    */
  243.   enum idclass klass            ;  /* 名前の種別                      */
  244.   union  { /*n*/
  245.     union valu values           ;  /* 定数 (konst)                    */
  246.     struct  { /*v*/                /* 変数 (vars)                     */
  247.       enum idkind vkind         ;  /*   変数の種別                    */
  248.       int         vlev          ;  /*   定義された水準                */
  249.       int         vaddr         ;  /*   変数の割りつけ開始アドレス    */
  250.     } v                         ;
  251.     int      fldaddr            ;  /* レコードの欄 (field)            */
  252.     struct  { /*pf*/               /* 手続き、関数 (proc,func)        */
  253.       enum declkind pfdeckind   ;  /*   宣言の種別 (standard/declared)*/
  254.       union   { /*sd*/
  255.         int   key               ;  /*[standard]  その識別数           */
  256.         struct { /*d*/             /*[declared]                       */
  257.           enum idkind pfkind    ;  /*     actual / formal             */
  258.           int pflev             ;  /*     定義された水準              */
  259.           union { /*af*/
  260.             struct { /*a*/         /*[actual]                         */
  261.               int pfname        ;  /*   p-codeラベル名                */
  262.               boolean forwdecl  ;  /*   前方宣言                      */
  263.           ctp *fwdptr       ;  /*   前方宣言リスト                */
  264.         } a                 ;
  265.         struct { /*f*/         /*[formal]                         */
  266.           int levadr        ;  /*   水準の格納アドレス            */
  267.           int adradr        ;  /*   実行開始アドレスの格納アドレス*/
  268.           ctp *prm          ;  /*   仮引数へのポインタ            */
  269.         } f                 ;
  270.       } af                  ;
  271.         } d                     ;
  272.       } sd                      ;
  273.     } pf                        ;
  274.   } n                           ;
  275. }                               ;
  276.  
  277. /*********************************************************************/
  278. /****             data structure  に関する型定義                  ****/
  279. /*********************************************************************/
  280.  
  281. enum structform {  scalar  ,    /* スカラー型 */
  282.                    subrange,    /* 範囲型     */
  283.                    pointer ,    /* ポインタ型 */
  284.                    power   ,    /*            */
  285.                    arrays  ,    /* 配列型     */
  286.                    records ,    /* レコード型 */
  287.                    files   ,    /* ファイル型 */
  288.                    tagfld  ,    /* タグフィールド  */ /* not structure */
  289.            variant } ;  /* 変数型     */ /* not structure */
  290.  
  291. typedef enum packedkind         /* 集合型の詰めあり/なし型の種別      */
  292.                  { unpacked,    /* 詰めなし (値0)・・・・ falseと同じ     */
  293.                    packed  ,    /* 詰めなし (値1)・・・・ true と同じ     */
  294.                    both    }    /* どちらでもない (集合構成子の場合)  */
  295.         packedkind          ;
  296.  
  297. struct Structure {
  298.    int              size           ;    /* その型のサイズ             */
  299.    enum structform  form           ;    /* 型の種別                   */
  300.    boolean          assignflag     ;    /* 代入可能な型の時  真       */
  301.    union {
  302.       struct {                          /*[scalar]                    */
  303.          enum declkind scalkind    ;    /*  standard/declared         */
  304.      ctp           *fconst     ;    /*  declared時 next欄で       */
  305.                                     /*    つながれる最後尾        */
  306.       } sc                         ;
  307.       struct {                          /*[subrange]                  */
  308.      stp           *rangetype  ;    /*  範囲の元となる型          */
  309.          long          min         ;    /*  最小値                    */
  310.          long          max         ;    /*  最大値                    */
  311.       } su                         ;
  312.       struct {                          /*[pointer]                   */
  313.      stp           *eltype     ;    /*  指し示すものの型          */
  314.       } pt                         ;
  315.       struct {                          /*[power]                     */
  316.          packedkind    packed      ;    /*  詰めあり/なし/両方        */
  317.      stp           *elset      ;    /*  要素の型                  */
  318.      int           elmin       ;    /*  要素の最小値              */
  319.      int           elmax       ;    /*  要素の最大値              */
  320.       } pw                         ;
  321.       struct {                          /*[arrays]                    */
  322.          boolean       packed      ;    /*  packed表示                */
  323.      stp           *aeltype    ;    /*  要素の型                  */
  324.      stp           *inxtype    ;    /*  添え字の型                */
  325.       } ar                         ;
  326.       struct {                          /*[records]                   */
  327.          boolean       packed      ;    /*  packed表示                */
  328.      ctp           *fstfld     ;    /*  レコードの最初の欄        */
  329.      stp           *recvar     ;    /*  可変部のtagfldをもつstp   */
  330.       } re                         ;
  331.       struct {                          /*[files]                     */
  332.          boolean       packed      ;    /*  packed表示                */
  333.          boolean       texttype    ;    /*  text型の時 真             */
  334.      stp           *filtype    ;    /*  ファイルの要素の型        */
  335.       } fi                         ;
  336.       struct {                          /*[tagfld] 可変要素選択子     */
  337.      ctp           *tagfieldp  ;    /*  タグ欄の名前              */
  338.      stp           *tagtype    ;    /*  タグ型                    */
  339.      stp           *fstvar     ;    /*  可変要素へのポインタ      */
  340.       } tg                         ;
  341.       struct {                          /*[variant] 可変要素          */
  342.      stp           *nextvr     ;    /*  次の可変要素              */
  343.      stp           *subvar     ;    /*  配下の可変部              */
  344.          long          varval      ;    /*  選択定数の値              */
  345.       } vr                         ;
  346.    } sf                            ;
  347. }                                  ;
  348.  
  349. /*********************************************************************/
  350. /****                     式  に関する型定義                      ****/
  351. /*********************************************************************/
  352.  
  353. enum attrkind {
  354.                 cst ,                   /* 定数                       */
  355.                 varbl,                  /* 変数                       */
  356.                 expr  };                /* 式                         */
  357.  
  358. enum vaccess {
  359.                 drct   ,                /* 直接                       */
  360.                 indrct                  /* 間接                       */
  361.              }         ;
  362.  
  363. typedef struct attr {
  364.    stp             *typtr ;             /* 型へのアドレス             */
  365.    enum attrkind   kind   ;             /* cst/varbl/expr             */
  366.   /*** kind=cst の 場合 ***/
  367.    union valu      cval   ;             /*[cst]  定数の値             */
  368.   /*** kind=varbl  の場合 ***/
  369.    enum  vaccess   access ;             /* drct/indrct                */
  370.    int   vlevel           ;             /*[drct] 定義された水準       */
  371.    int   dplmt            ;             /*[drct] 割りつけ開始番地     */
  372.    int   idplmt           ;             /*[indrct]                    */
  373. } attr ;
  374.  
  375. /*********************************************************************/
  376. /****             共通変数                                        ****/
  377. /*********************************************************************/
  378.  
  379. /**** display *****/
  380.  
  381. typedef struct Aplist aplist ;
  382. struct Aplist {                 /* 同一水準で参照された名前リスト   */
  383.    ctp        *name      ;
  384.    aplist     *next      ;
  385. }                        ;
  386.  
  387. EXTERN int top           ;      /* display の 現在のトップを示すもの*/
  388. EXTERN int level         ;      /* 現在の水準                       */
  389. EXTERN int disx          ;      /* searchidで見つかった水準         */
  390.                                 /*  共通変数になっているのはよくない*/
  391. EXTERN int mainlabel     ;      /* メインブロックのP-codeラベル値   */
  392.  
  393. EXTERN struct {
  394.    ctp         *fname    ;      /* その水準で定義した名前リスト     */
  395.    lbp         *flabel   ;      /* その水準のラベルリスト           */
  396.    ctp         *funcname ;      /* その水準の関数名                 */
  397.    aplist      *aname    ;      /* その水準での引用名リスト         */
  398.    boolean     funcassign;      /* その水準の関数名への代入表示     */
  399.    enum where  occur     ;      /* その水準の定義される場所を示す   */
  400.    int         clev      ;      /*[occur=crec]*/
  401.    int         cdspl     ;      /*[occur=crec]*/
  402.    int         vdspl     ;      /*[occur=vrec]*/
  403. } display[Displimit+1]   ;
  404.  
  405. /**** symbol set *****/
  406. EXTERN Set constbegsys   ;      /* constant begin symbol set    */
  407. EXTERN Set simptypebegsys;      /* simple type begin symbol set */
  408. EXTERN Set typebegsys    ;      /* type begin symbol set        */
  409. EXTERN Set blockbegsys   ;      /* block begin symbol set       */
  410. EXTERN Set selectsys     ;      /* selector symbol set          */
  411. EXTERN Set facbegsys     ;      /* factor begin symbol set      */
  412. EXTERN Set statbegsys    ;      /* statement begin symbol set   */
  413. EXTERN Set statfolsys    ;      /* statement follow symbol set  */
  414. EXTERN Set typedels      ;      /* typed element symbol set     */
  415.  
  416. /**** returned by insymbol() *****/
  417.  
  418. EXTERN enum symbol   sy ;       /* 要素のsymbol  */
  419. EXTERN enum operator op ;       /* 演算子        */
  420. EXTERN char id[MaxIDlng+1] ;    /* identifier    */
  421. EXTERN int  ch ;                /* 読込文字      */
  422. EXTERN int           lgth  ;    /* 文字列等の長さ*/
  423. EXTERN union valu    val   ;    /* 値            */
  424.  
  425. /**** pointers ****/
  426.  
  427. EXTERN extfilep  *fextfilep ;           /* プログラム引数(ファイル名)ポインタ */
  428.  
  429. EXTERN stp *parmptr ;
  430. EXTERN stp *intptr  ;
  431. EXTERN stp *realptr ;
  432. EXTERN stp *charptr ;
  433. EXTERN stp *boolptr ;
  434. EXTERN stp *nilptr  ;
  435. EXTERN stp *textptr ;
  436.  
  437. EXTERN ctp *fwptr   ;    /* ポインタ型の前方参照のものをつないでおく  */
  438.  
  439. EXTERN ctp *utypptr ;    /* 型名が未定義の時に返却する名前ポインタ    */
  440. EXTERN ctp *ucstptr ;    /* 定数名が未定義の時に返却する名前ポインタ  */
  441. EXTERN ctp *uvarptr ;    /* 変数名が未定義の時に返却する名前ポインタ  */
  442. EXTERN ctp *ufldptr ;    /* フィールド名が未定義の時に返却する名前ポインタ*/
  443. EXTERN ctp *uprcptr ;    /* 手続き名が未定義の時に返却する名前ポインタ*/
  444. EXTERN ctp *ufctptr ;    /* 関数名が未定義の時に返却する名前ポインタ  */
  445.  
  446.  
  447. /**** flags ****/
  448.  
  449. EXTERN boolean defineinput ;     /* input ファイル定義あり の時 真    */
  450. EXTERN boolean defineoutput;     /* outputファイル定義あり の時 真    */
  451. EXTERN boolean pcode ;           /* Pコードの出力要否                 */
  452. EXTERN boolean debug ;           /* デバッグコンパイル指定            */
  453. EXTERN boolean pcdinf;           /* Pコードの情報出力要否             */
  454. EXTERN boolean typevar;          /* 型定義部での型の処理を行う時true
  455.                                    変数定義部での型の処理を行う時false
  456.                               (ポインタ型前方参照チェックのために使用 */
  457.  
  458. /**** Pcode 関連 ****/
  459. EXTERN int topnew    ;        /* その命令を実行した時のスタックの先頭 */
  460. EXTERN int topmax    ;        /* 最も大きくなる場合のスタックの先頭   */
  461. EXTERN int ic        ;        /* instruction counter                  */
  462. EXTERN int lc        ;        /* location   counter (変数の割当番地)  */
  463.  
  464. /**** list 関係 ****/
  465. EXTERN int   lineno;                    /* ソースの行番号             */
  466. EXTERN char  *passname;                 /* Pascal source file name    */
  467. EXTERN int   errorcount  ;              /* 発見したエラー数           */
  468.  
  469. /**** 式のコンパイル時に使用する属性エリア ****/
  470. EXTERN attr gattr           ;
  471.